#include "..\headers\ListOf.h"

typedef struct {
  int Data[1000];
  int length;
} SqList;
// 判断数据是否非法
int DataIf(SqList &L, int i) {
  if ((i > L.length || i < 1 && L.length != 0) || L.length > max) {
    return ERROR;
  }
  if (i > max || i < 1) return ERROR;
  return OK;
}
// 顺序表初始化
int InitList(SqList &L) {
  L.length = 0;
  return OK;
}
// 顺序表创建
int CreateList(SqList &L, int data[], int n) {  // n代表数组长度
  if (n > max) {
    printf("CreateList 超出最大范围");
    return ERROR;
  }
  for (int k = 0; k < n; k++) {
    L.Data[k] = data[k];
  }
  L.length = n;
  return OK;
}
// 判断链表是否为空
bool isEmpty(SqList &L) { return L.length == 0; }
// 求链表长度
long LengthOfLink(SqList &L) { return L.length; }
// 遍历操作
void PrintList(SqList &L) {
  for (long i = 0; i < L.length; i++) {
    printf("data[%d]:%d\n", i + 1, L.Data[i]);
  }
}
// 按值查找
int Locate(SqList &L, long x) {  // x代表查找与Data相等的数
  for (long i = 0; i < L.length; i++) {
    if (L.Data[i] == x) {
      return i + 1;
    }
  }
  return ERROR;
}
// 按位查找
int Get(SqList &L, int x, int *ptr) {  // 若查找成功，则通过指针参数ptr返回值
  if (!DataIf(L, x)) {
    printf("Get 查找位置非法，查找错误\n");
    return 0;
  } else {
    *ptr = L.Data[x];
    return 1;
  }
}

int Insert(SqList &L, int NumberOfDigits,
           int num) {  // x是插入的位置 e是插入数据的参数
  if (!DataIf(L, NumberOfDigits)) {
    printf("Insert 插入位置非法\n");
    return ERROR;
  }
  if (L.length == max) {
    printf("Insert 上限溢出");
    return ERROR;
  }
  for (int i = L.length - 1; i >= NumberOfDigits - 1; i--) {
    L.Data[i + 1] = L.Data[i];
  }
  L.Data[NumberOfDigits - 1] = num;
  L.length++;
  return OK;
}
// 删除操作
int Delete(SqList &L, int i, int *ptr) {
  if (!DataIf(L, i)) {
    printf("Delete 删除位置错误！\n");
    return ERROR;
  }
  if (L.length == 0) {
    printf("Delete 下溢错误");
    return ERROR;
  }
  *ptr = L.Data[i - 1];  // 将删除的数据返回
  for (int j = i; j < L.length; j++) {
    L.Data[j - 1] = L.Data[j];
  }
  L.length--;
  return OK;
}

// 修改数值
int Modify(SqList &L, int i, int x) {
  if (i > L.length || i < 1) {
    printf("Modify 位置错误！\n");
    return ERROR;
  }
  L.Data[i - 1] = x;
  return OK;
}

int main(void) {
  int a[5] = {1, 2, 3, 4, 5};
  int i, x;
  SqList list1;
  InitList(list1);  // 初始化顺序表
  if (isEmpty(list1)) {
    printf("初始化顺序表成功！\n");
  }

  printf("给顺序表赋值：1 2 3 4 5\n遍历并输出顺序表：\n");
  CreateList(list1, a, 5);
  PrintList(list1);

  printf("\n在第三位后插入一个100：\n");
  Insert(list1, 3, 100);
  PrintList(list1);

  if (Modify(list1, 3, 50)) {
    printf("\n把第三位改成50\n");
    PrintList(list1);
  }
  if (Delete(list1, 4, &x)) {
    printf("\n把第四位删除，删除的值是%d\n", x);
    PrintList(list1);
  }
  system("pause");
  return 0;
}
